#include <iostream>
#include <functional>

// 1.普通函数
void print_hello()
{
    std::cout << "Hello, world!" << std::endl;
}

// 2. 带参数和返回值的普通函数
int add(int a, int b)
{
    return a + b;
}


// 3. 函数对象（重载 operator()）
struct Subtract
{
    int operator()(int a, int b) const
    {
        return a - b;
    }
};

// 4. 类与成员函数
class Calculator 
{
public:
    int multiply(int a, int b) const
    {
        return a * b;
    }
};

int main()
{
    // 包装无参无返回值的函数
    std::function<void()> func1 = print_hello;
    func1();

    // 包装带参数和返回值的函数（int(int, int) 表示参数为两个int，返回int）
    std::function<int(int, int)> func2 = add;
    std::cout << func2(1, 2) << std::endl;

    // 包装lambda表达式
    std::function<int(int, int)> func3 = [](int a, int b) { return a + b; };
    std::cout << func3(1, 2) << std::endl;

    // 包装函数对象
    Subtract sub;
    std::function<int(int, int)> func4 = sub;

    // 包装类成员函数（需要绑定对象实例）
    Calculator calc;
    std::function<int(int, int)> func5 = std::bind(&Calculator::multiply, &calc, std::placeholders::_1, std::placeholders::_2);
    std::cout << func5(2, 3) << std::endl;
    return 0;
}